﻿'Imports Fgv.Framework.Seguranca.Dal
'Imports SegurancaDal = Fgv.Framework.Seguranca.Dal
'Imports Fgv.Framework.Seguranca.Dominio
'Imports System.Web
'Imports Spring.Transaction.Interceptor
'Imports Spring.Transaction
'Imports System.Collections.Generic

'Namespace Seguranca.Servico

'    ''' <summary>
'    ''' Classe de Autorização de serviço do SigaDois
'    ''' </summary>
'    ''' <remarks></remarks>
'    Public Class SigaDoisAutorizacaoServico
'        Implements IAutorizacaoServico

'#Region "Classes injetadas"

'        Private _papelDao As IPapelDao

'        ''' <summary>
'        ''' Propriedade do Papel Dao
'        ''' </summary>
'        ''' <value>interface IPapelDao</value>
'        ''' <returns>interface IPapelDao</returns>
'        ''' <remarks></remarks>
'        Public Property PapelDao() As IPapelDao
'            Get
'                Return _papelDao
'            End Get
'            Set(ByVal value As IPapelDao)
'                _papelDao = value
'            End Set
'        End Property

'        Private _PapelUsuarioDao As IPapelUsuarioDao
'        ''' <summary>
'        ''' Propriedade do PapelUsuario Dao
'        ''' </summary>
'        ''' <value>interface IPapelUsuarioDao</value>
'        ''' <returns>interface IPapelUsuarioDao</returns>
'        ''' <remarks></remarks>
'        Public Property PapelUsuarioDao() As IPapelUsuarioDao
'            Get
'                Return _PapelUsuarioDao
'            End Get
'            Set(ByVal value As IPapelUsuarioDao)
'                _PapelUsuarioDao = value
'            End Set
'        End Property

'        Private _perfilDao As IPerfilDao

'        ''' <summary>
'        ''' Propriedade do Perfil Dao
'        ''' </summary>
'        ''' <value>interface IPerfilDao</value>
'        ''' <returns>interface IPerfilDao</returns>
'        ''' <remarks></remarks>
'        Public Property PerfilDao() As IPerfilDao
'            Get
'                Return _perfilDao
'            End Get
'            Set(ByVal value As IPerfilDao)
'                _perfilDao = value
'            End Set
'        End Property

'        Private _permissaoDao As IPermissaoDao

'        ''' <summary>
'        ''' Propriedade da Permissao Dao
'        ''' </summary>
'        ''' <value>interface IPermissaoDao</value>
'        ''' <returns>interface IPermissaoDao</returns>
'        ''' <remarks></remarks>
'        Public Property PermissaoDao() As IPermissaoDao
'            Get
'                Return _permissaoDao
'            End Get
'            Set(ByVal value As IPermissaoDao)
'                _permissaoDao = value
'            End Set
'        End Property

'        Private _recursoDao As SegurancaDal.IRecursoDao

'        ''' <summary>
'        ''' Propriedade do Recurso Dao
'        ''' </summary>
'        ''' <value>interface IRecursoDao</value>
'        ''' <returns>interface IRecursoDao</returns>
'        ''' <remarks></remarks>
'        Public Property RecursoDao() As SegurancaDal.IRecursoDao
'            Get
'                Return _recursoDao
'            End Get
'            Set(ByVal value As SegurancaDal.IRecursoDao)
'                _recursoDao = value
'            End Set
'        End Property

'        Private _UsuarioDao As SegurancaDal.IUsuarioDao

'        ''' <summary>
'        ''' Propriedade do Usuario Dao
'        ''' </summary>
'        ''' <value>interface IUsuarioDao</value>
'        ''' <returns>interface IUsuarioDao</returns>
'        ''' <remarks></remarks>
'        Public Property UsuarioDao() As SegurancaDal.IUsuarioDao
'            Get
'                Return _UsuarioDao
'            End Get
'            Set(ByVal value As SegurancaDal.IUsuarioDao)
'                _UsuarioDao = value
'            End Set
'        End Property


'        Private _usuarioDocenteDao As IUsuarioDocenteDao
'        Public Property UsuarioDocenteDao() As IUsuarioDocenteDao
'            Get
'                Return _usuarioDocenteDao
'            End Get
'            Set(ByVal value As IUsuarioDocenteDao)
'                _usuarioDocenteDao = value
'            End Set
'        End Property

'#End Region

'        Private _usuarioDaoSistemaAcademico As IUsuarioDaoSistemaAcademico
'        Public Property UsuarioDaoSistemaAcademico() As IUsuarioDaoSistemaAcademico
'            Get
'                Return _usuarioDaoSistemaAcademico
'            End Get
'            Set(ByVal value As IUsuarioDaoSistemaAcademico)
'                _usuarioDaoSistemaAcademico = value
'            End Set
'        End Property

'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function AutorizaRequest(ByVal _path As String) As Boolean Implements IAutorizacaoServico.AutorizaRequest

'            Throw New NotImplementedException("REMOVIDO NA REVISÃO")

'            'Dim _permissao As New Permissao
'            '_permissao.Path = _path.Trim
'            'Dim _papeis As IList(Of Papel) = PapelDao.BuscarPorPathDoRecurso(_path)
'            'If _papeis IsNot Nothing Then
'            '    For Each _papel As Papel In _papeis
'            '        Dim _sigaUmAutenticacaoServico As IAutenticacaoServico = New SigaUmAutenticacaoServico
'            '        'TODO: refactoring de _sigaUmAutenticacaoServico.PersisteContextoUsuario, colocando o método em local novo.
'            '        _sigaUmAutenticacaoServico.RecuperaContextoUsuario(HttpContext.Current)

'            '        If HttpContext.Current.User.IsInRole(_papel.Mnemonico) _
'            '        OrElse UsuarioTemPapelFilhoSemRestricao(_papel.Filhos, _path) Then
'            '            Return True
'            '        End If

'            '        _sigaUmAutenticacaoServico.PersisteContextoUsuario(HttpContext.Current)
'            '    Next
'            '    'Para cada um dos papéis do usuário, caso um de seus pais tenha permissão
'            '    'de acesso ao recurso, retorna verdadeiro.
'            'End If
'            'Return False
'        End Function

'        ''' <summary>
'        ''' Função que retorna se o Papel nao tem restrição
'        ''' </summary>
'        ''' <param name="_papeis">Lista(classe Papel)</param>
'        ''' <param name="_pathDoRecurso">String</param>
'        ''' <returns>Boolean</returns>
'        ''' <remarks></remarks>
'        Private Function UsuarioTemPapelFilhoSemRestricao(ByVal _papeis As IList(Of Papel), ByVal _pathDoRecurso As String) As Boolean
'            For Each _papel In _papeis
'                If HttpContext.Current.User.IsInRole(_papel.Mnemonico) Then
'                    If Not PapelTemRestricao(_papel, _pathDoRecurso) Then
'                        Return True
'                    End If
'                End If
'                If UsuarioTemPapelFilhoSemRestricao(_papel.Filhos, _pathDoRecurso) Then
'                    Return True
'                End If
'            Next
'            Return False
'        End Function

'        ''' <summary>
'        ''' Função que retorna se o Papel tem restrição
'        ''' </summary>
'        ''' <param name="_papel">classe Papel</param>
'        ''' <param name="_pathDoRecurso">String</param>
'        ''' <returns>Boolean</returns>
'        ''' <remarks></remarks>
'        Private Function PapelTemRestricao(ByVal _papel As Papel, ByVal _pathDoRecurso As String) As Boolean
'            For Each _recurso As Recurso In _papel.Restricoes
'                If _recurso.Url = _pathDoRecurso Then
'                    Return True
'                End If
'            Next
'            Return False
'        End Function

'        ''' <summary>
'        ''' Função que retorna se o usuário tem Perfil.
'        ''' </summary>
'        ''' <param name="_perfil">classe Perfil</param>
'        ''' <returns>Boolean</returns>
'        ''' <remarks></remarks>
'        Private Function UsuarioTemPerfil(ByVal _perfil As Perfil) As Boolean
'            Dim _perfisUsuario As IList(Of Perfil)
'            If HttpContext.Current.Session("_perfisUsuario") IsNot Nothing Then
'                _perfisUsuario = TryCast(HttpContext.Current.Session("_perfisUsuario"), IList(Of Perfil))
'                If _perfisUsuario IsNot Nothing And _perfil IsNot Nothing Then
'                    For Each _perfilUsuario As Perfil In _perfisUsuario
'                        If (String.Compare(_perfilUsuario.Chave, _perfil.Chave) = 0) AndAlso _
'                        (String.Compare(_perfilUsuario.Valor, _perfil.Valor) = 0) Then
'                            Return True
'                        End If
'                    Next
'                End If
'            End If
'            Return False
'        End Function

'        ''' <summary>
'        ''' Função que verifica se o usuário tem um perfil.
'        ''' </summary>
'        ''' <param name="_perfil">classe Perfil</param>
'        ''' <returns>Boolean</returns>
'        ''' <remarks></remarks>
'        Private Function UsuarioTemPerfilFilho(ByVal _perfil As Perfil) As Boolean
'            Dim _perfisUsuario As IList(Of Perfil)
'            If HttpContext.Current.Session("_perfisUsuario") IsNot Nothing Then
'                _perfisUsuario = TryCast(HttpContext.Current.Session("_perfisUsuario"), IList(Of Perfil))
'                If _perfisUsuario IsNot Nothing And _perfil IsNot Nothing Then
'                    For Each _perfilUsuario As Perfil In _perfisUsuario
'                        Dim _prefilUsuarioPersistente As Perfil = PerfilDao.BuscarPorChaveEValor(_perfilUsuario.Chave, _perfilUsuario.Valor)
'                        If _prefilUsuarioPersistente IsNot Nothing AndAlso _prefilUsuarioPersistente.Pai IsNot Nothing Then
'                            If (String.Compare(_prefilUsuarioPersistente.Pai.Chave, _perfil.Chave) = 0) AndAlso _
'                            (String.Compare(_prefilUsuarioPersistente.Pai.Valor, _perfil.Valor) = 0) Then
'                                Return True
'                            End If
'                        End If
'                    Next
'                End If
'            End If
'            Return False
'        End Function

'        ''' <summary>
'        ''' Função que retorna se a autorização da operação é válida
'        ''' </summary>
'        ''' <param name="_tipoOperacao">classe TipoOperacao</param>
'        ''' <returns>Boolean</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function AutorizaOperacao(ByVal _tipoOperacao As TipoOperacao) As Boolean Implements IAutorizacaoServico.AutorizaOperacao
'            Dim _papeis As IList(Of Papel) = PapelDao.BuscarPorTipoOperacao(_tipoOperacao)
'            If _papeis IsNot Nothing Then
'                For Each _papel As Papel In _papeis
'                    If HttpContext.Current.User.IsInRole(_papel.Nome) Then
'                        Return True
'                    End If
'                Next
'            End If
'            Return False
'        End Function

'        ''' <summary>
'        ''' Função que busca os Papeis.
'        ''' </summary>
'        ''' <returns>Lista(classe Papel)</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarPapeis() As IList(Of Papel) Implements IAutorizacaoServico.BuscarPapeis
'            Return PapelDao.BuscarTodos()
'        End Function

'        ''' <summary>
'        ''' Função que busca as permissões herdadas do Papel.
'        ''' </summary>
'        ''' <param name="_papel">classe Papel</param>
'        ''' <returns>Lista(classe Recurso)</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarPermissoesHerdadas(ByVal _papel As Papel) As IList(Of Recurso) Implements IAutorizacaoServico.BuscarPermissoesHerdadas
'            Dim _recursos As IList(Of Recurso) = New List(Of Recurso)
'            If _papel.Pai IsNot Nothing Then
'                _papel = _papel.Pai
'            Else
'                Return _recursos
'            End If
'            While (_papel.Recursos IsNot Nothing) Or (_papel.Pai IsNot Nothing)
'                If _papel.Recursos IsNot Nothing Then
'                    Dim _restricoes As IList(Of Recurso) = BuscarRestricoes(_papel)
'                    Dim _recursosSemRestricao As New List(Of Recurso)
'                    _recursosSemRestricao = _recursosSemRestricao.Concat(_papel.Recursos).ToList()
'                    RetirarRestricoes(_recursosSemRestricao, _restricoes)
'                    _recursos = _recursos.Concat(_recursosSemRestricao).ToList()
'                End If
'                If _papel.Pai IsNot Nothing Then
'                    _papel = _papel.Pai
'                Else
'                    Return _recursos
'                End If
'            End While
'            Return Nothing
'        End Function

'        ''' <summary>
'        ''' Função que busca as restriçoes do Papel
'        ''' </summary>
'        ''' <param name="_papel">classe Papel</param>
'        ''' <returns>Lista(classe Recurso)</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarRestricoes(ByVal _papel As Papel) As IList(Of Recurso) Implements IAutorizacaoServico.BuscarRestricoes
'            Dim _restricoes As New List(Of Recurso)
'            While _papel.Pai IsNot Nothing
'                _restricoes = _restricoes.Concat(_papel.Restricoes).ToList
'                _papel = _papel.Pai
'            End While
'            Return _restricoes
'        End Function

'        ''' <summary>
'        ''' Sub que retira as restrições do Papel
'        ''' </summary>
'        ''' <param name="_recursos">Lista(classe Recurso)</param>
'        ''' <param name="_restricoes">Lista(classe Recurso)</param>
'        ''' <remarks></remarks>
'        Private Sub RetirarRestricoes(ByVal _recursos As IList(Of Recurso), ByVal _restricoes As IList(Of Recurso))
'            For Each _recurso As Recurso In _recursos
'                If _restricoes.Contains(_recurso) Then
'                    _recursos.Remove(_recurso)
'                End If
'            Next
'        End Sub

'        ''' <summary>
'        ''' Busca a permissão pelo Papel, Tipo de Módulo e Tipo da Permissão
'        ''' </summary>
'        ''' <param name="_papel">classe Papel</param>
'        ''' <param name="_modulo">classe TipoModulo</param>
'        ''' <param name="_tipoPermissao">classe TipoPermissao</param>
'        ''' <returns>Lista(classe Permissao)</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarPermissoesPorPapelEModuloETipo(ByVal _papel As Papel, ByVal _modulo As TipoModulo, ByVal _tipoPermissao As TipoPermissao) As System.Collections.Generic.IList(Of Dominio.Permissao) Implements IAutorizacaoServico.BuscarPermissoesPorPapelEModuloETipo
'            Return PermissaoDao.BuscarPorPapelEModuloETipo(_papel, _modulo, _tipoPermissao)
'        End Function

'        ''' <summary>
'        ''' Busca as permissoes do sistema.
'        ''' </summary>
'        ''' <returns>Lista(classe Permissao)</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarPermissoes() As System.Collections.Generic.IList(Of Dominio.Permissao) Implements IAutorizacaoServico.BuscarPermissoes
'            Return PermissaoDao.BuscarTodos()
'        End Function

'        ''' <summary>
'        ''' Busca os Recursos do sistema.
'        ''' </summary>
'        ''' <returns>Lista(classe Recurso)</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarRecursos() As System.Collections.Generic.IList(Of Dominio.Recurso) Implements IAutorizacaoServico.BuscarRecursos
'            Return RecursoDao.BuscarTodos()
'        End Function

'        ''' <summary>
'        ''' Retorna as permissoes pelo Tipo de Módulo e Tipo de Permissao
'        ''' </summary>
'        ''' <param name="_modulo">classe TipoModulo</param>
'        ''' <param name="_tipoPermissao">classe TipoPermissao</param>
'        ''' <returns>Lista(classe Permissao)</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarPermissoesPorModuloETipo(ByVal _modulo As TipoModulo, ByVal _tipoPermissao As TipoPermissao) As System.Collections.Generic.IList(Of Dominio.Permissao) Implements IAutorizacaoServico.BuscarPermissoesPorModuloETipo
'            Return PermissaoDao.BuscarPorModuloETipo(_modulo, _tipoPermissao)
'        End Function

'        ''' <summary>
'        ''' Salva o Papel
'        ''' </summary>
'        ''' <param name="_papel">classe Papel</param>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Required)> _
'        Public Sub SalvarPapel(ByVal _papel As Dominio.Papel) _
'            Implements IAutorizacaoServico.SalvarPapel
'            If _papel.Id <> 0 Then
'                PapelDao.Alterar(_papel)
'            Else
'                PapelDao.Salvar(_papel)
'            End If
'        End Sub

'        ''' <summary>
'        ''' Retorna o Papel atraves do ID
'        ''' </summary>
'        ''' <param name="_id">Long</param>
'        ''' <returns>classe Papel</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarPapelPorId(ByVal _id As Long) As Dominio.Papel Implements IAutorizacaoServico.BuscarPapelPorId
'            Return PapelDao.Buscar(_id)
'        End Function

'        ''' <summary>
'        ''' Retorna o Papel atraves do mnemonico.
'        ''' </summary>
'        ''' <param name="_mnemonico">String</param>
'        ''' <returns>classe Papel</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarPapelPorMnemonico(ByVal _mnemonico As String) As Dominio.Papel _
'            Implements IAutorizacaoServico.BuscarPapelPorMnemonico
'            Return PapelDao.BuscarPorMnemonico(_mnemonico)
'        End Function

'        ''' <summary>
'        ''' Busca as permissões pelo ID
'        ''' </summary>
'        ''' <param name="_id">Long</param>
'        ''' <returns>classe Permissao</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarPermissaoPorId(ByVal _id As Long) As Dominio.Permissao Implements IAutorizacaoServico.BuscarPermissaoPorId
'            Return PermissaoDao.Buscar(_id)
'        End Function

'        ''' <summary>
'        ''' Busca o recurso pelo ID.
'        ''' </summary>
'        ''' <param name="_id">Long</param>
'        ''' <returns>classe Recurso</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarRecursoPorId(ByVal _id As Long) As Dominio.Recurso Implements IAutorizacaoServico.BuscarRecursoPorId
'            Return RecursoDao.Buscar(_id)
'        End Function

'        ''' <summary>
'        ''' Busca o Usuário pelo ID.
'        ''' </summary>
'        ''' <param name="_id">Long</param>
'        ''' <returns>classe Usuario</returns>
'        ''' <remarks></remarks>
'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarUsuarioPorId(ByVal _id As Long) As Dominio.Usuario _
'            Implements IAutorizacaoServico.BuscarUsuarioPorId
'            Return UsuarioDao.Buscar(_id)
'        End Function

'        Public Function BuscarUsuarioPorCodigoExterno(ByVal _codigoExterno As String) As Dominio.Usuario _
'            Implements IAutorizacaoServico.BuscarUsuarioPorCodigoExterno
'            Return UsuarioDao.BuscarPorCodigoExterno(_codigoExterno)
'        End Function

'        Public Function BuscarIDUsuarioLogado() As Nullable(Of Long) _
'            Implements IAutorizacaoServico.BuscarIDUsuarioLogado
'            If Not IsNothing(HttpContext.Current.Session("_usuario")) Then
'                Dim _usuario As Usuario = CType(HttpContext.Current.Session("_usuario"),  _
'                                                Usuario)
'                Return _usuario.Id
'            End If
'            Return Nothing
'        End Function

'        <Transaction(TransactionPropagation.Required)> _
'        Public Sub AlterarUsuario(ByVal _usuarioDto As UsuarioDto) _
'            Implements IAutorizacaoServico.AlterarUsuario
'            _usuarioDaoSistemaAcademico.AtualizarUsuario(_usuarioDto)
'        End Sub

'        <Transaction(TransactionPropagation.Required)> _
'        Public Sub SalvarUsuario(ByRef _usuario As Dominio.Usuario, _
'                                 ByVal _usuarioDto As UsuarioDto, _
'                                 ByVal _perfisSiga1 As List(Of PerfilUsuarioDto)) _
'                                 Implements IAutorizacaoServico.SalvarUsuario
'            If _usuario.Id = 0 Then
'                _UsuarioDao.Salvar(_usuario)
'                _usuarioDaoSistemaAcademico.CadastrarUsuario(_usuarioDto, _perfisSiga1)
'            Else
'                _UsuarioDao.SalvarOuAlterar(_usuario)
'                _usuarioDaoSistemaAcademico.AtualizarUsuario(_usuarioDto, _perfisSiga1)
'            End If
'        End Sub

'        <Transaction(TransactionPropagation.Required)> _
'        Public Sub SalvarUsuarioSigaDois(ByRef _usuario As Dominio.Usuario) _
'                                 Implements IAutorizacaoServico.SalvarUsuarioSigaDois
'            If _usuario.Id = 0 Then
'                _UsuarioDao.Salvar(_usuario)
'            Else
'                _UsuarioDao.Alterar(_usuario)
'            End If
'        End Sub

'        Public Function BuscarUsuarioSistemaAcademicoPorCodigoExterno(ByVal _codigoExterno As String) As UsuarioDto _
'            Implements IAutorizacaoServico.BuscarUsuarioSistemaAcademicoPorCodigoExterno

'            Dim _usuarioDto As UsuarioDto

'            _usuarioDto = Me.UsuarioDaoSistemaAcademico.BuscarPorCodigoExterno(_codigoExterno)

'            _usuarioDto.Perfis = Me.UsuarioDaoSistemaAcademico.BuscarPerfisUsuarioPorCodigoExterno(_codigoExterno)

'            If Not IsNothing(_usuarioDto.Perfis) Then
'                If _usuarioDto.Perfis.Count > 0 Then
'                    For Each _perfil As PerfilUsuarioDto In _usuarioDto.Perfis
'                        If (Not String.IsNullOrEmpty(_usuarioDto.SenhaFinanceira)) _
'                            And (Not String.IsNullOrEmpty(_usuarioDto.SenhaImpressaoContrato)) Then
'                            Exit For
'                        End If
'                        _usuarioDto.SenhaFinanceira = _perfil.SenhaFinanceira
'                        _usuarioDto.SenhaImpressaoContrato = _perfil.SenhaImpressaoContrato
'                    Next
'                End If
'            End If

'            Return _usuarioDto

'        End Function

'        Public Function BuscarPapelPorNome(ByVal nome As String) As Dominio.Papel _
'            Implements IAutorizacaoServico.BuscarPapelPorNome
'            Dim _papeis As System.Collections.Generic.IList(Of Dominio.Papel)
'            _papeis = (From p In Me.BuscarPapeis().AsEnumerable() _
'                        Where p.Nome.ToUpper = nome.ToUpper _
'                        Order By p.Nome Ascending _
'                        Select p).ToList()
'            If IsNothing(_papeis) Then
'                Return Nothing
'            Else
'                If _papeis.Count = 0 Then
'                    Return Nothing
'                Else
'                    Return _papeis.First
'                End If
'            End If
'        End Function

'        Public Function BuscarPapeisPorNome(ByVal nome As String) As IList(Of Dominio.Papel) _
'            Implements IAutorizacaoServico.BuscarPapeisPorNome
'            Dim _papeis As System.Collections.Generic.IList(Of Dominio.Papel)
'            _papeis = (From p In Me.BuscarPapeis().AsEnumerable() _
'                        Where p.Nome.Contains(nome) _
'                        Order By p.Nome Ascending _
'                        Select p).ToList()

'            Return _papeis
'        End Function

'        Public Function BuscarPapeisPorPapel(ByVal _papel As Papel) As List(Of Papel) _
'            Implements IAutorizacaoServico.BuscarPapeisPorPapel
'            Return _papelDao.BuscarPapeisPorPapel(_papel)
'        End Function

'        Public Function BuscarUsuarioSistemaAcademicoPorUsuarioDto( _
'            ByVal _usuarioDto As UsuarioDto) As List(Of UsuarioDto) _
'            Implements IAutorizacaoServico.BuscarUsuarioSistemaAcademicoPorUsuarioDto
'            Return _usuarioDaoSistemaAcademico.BuscarPorUsuarioDto(_usuarioDto)
'        End Function

'        <Transaction(TransactionPropagation.Required)> _
'        Public Sub BloquearUsuarioSistemaAcademico(ByVal _codigoExterno As String) _
'            Implements IAutorizacaoServico.BloquearUsuarioSistemaAcademico
'            Dim _usuarioDto As UsuarioDto = _
'                BuscarUsuarioSistemaAcademicoPorCodigoExterno(_codigoExterno)
'            _usuarioDto.Ativo = "N"
'            _usuarioDaoSistemaAcademico.AtualizarUsuario(_usuarioDto)
'        End Sub

'        <Transaction(TransactionPropagation.Required)> _
'        Public Sub DesbloquearUsuarioSistemaAcademico(ByVal _codigoExterno As String) _
'            Implements IAutorizacaoServico.DesbloquearUsuarioSistemaAcademico
'            Dim _usuarioDto As UsuarioDto = _
'                BuscarUsuarioSistemaAcademicoPorCodigoExterno(_codigoExterno)
'            _usuarioDto.Ativo = "S"
'            _usuarioDaoSistemaAcademico.AtualizarUsuario(_usuarioDto)
'        End Sub

'        <Transaction(TransactionPropagation.Required)> _
'        Public Sub BloquearUsuario(ByVal _idUsuario As Integer) _
'            Implements IAutorizacaoServico.BloquearUsuario
'            Dim _usuario As Usuario = Me.UsuarioDao.Buscar(_idUsuario)
'            _usuario.Ativo = False
'            Me.UsuarioDao.Alterar(_usuario)
'        End Sub

'        <Transaction(TransactionPropagation.Required)> _
'        Public Sub DesbloquearUsuario(ByVal _idUsuario As Integer) _
'            Implements IAutorizacaoServico.DesbloquearUsuario
'            Dim _usuario As Usuario = Me.UsuarioDao.Buscar(_idUsuario)
'            _usuario.Ativo = True
'            Me.UsuarioDao.Alterar(_usuario)
'        End Sub

'        Public Function UsuarioLogadoTemPapel(ByVal _idPapel As Integer) As Boolean _
'            Implements IAutorizacaoServico.UsuarioLogadoTemPapel
'            Dim _usuario As Usuario = CType(HttpContext.Current.Session("_usuario"), Usuario)
'            If Not IsNothing(_usuario.Papeis) Then
'                If _usuario.Papeis.Count > 0 Then
'                    For Each _papel In _usuario.Papeis
'                        If _papel.Id = _idPapel Then
'                            Return True
'                        End If
'                    Next
'                End If
'            End If
'            Return False
'        End Function

'        Public Function BuscarExtensoes(ByVal _idPapel As Integer) As IList(Of Papel) _
'            Implements IAutorizacaoServico.BuscarExtensoes
'            Dim _lista As New List(Of Papel)
'            Dim _papel As Papel = BuscarPapelPorId(_idPapel)

'            If _papel.Extensoes.Count > 0 Then
'                For Each _extensao In _papel.Extensoes
'                    _lista.Add(_extensao)
'                Next
'            End If
'            If Not IsNothing(_papel.Pai) Then
'                If _papel.Pai.Extensoes.Count > 0 Then
'                    For Each _extensao In _papel.Pai.Extensoes
'                        _lista.Add(_extensao)
'                    Next
'                End If
'                If Not IsNothing(_papel.Pai.Pai) Then
'                    If _papel.Pai.Pai.Extensoes.Count > 0 Then
'                        For Each _extensao In _papel.Pai.Pai.Extensoes
'                            _lista.Add(_extensao)
'                        Next
'                    End If
'                    If Not IsNothing(_papel.Pai.Pai.Pai) Then
'                        If _papel.Pai.Pai.Pai.Extensoes.Count > 0 Then
'                            For Each _extensao In _papel.Pai.Pai.Pai.Extensoes
'                                _lista.Add(_extensao)
'                            Next
'                        End If
'                    End If
'                End If
'            End If

'            Return _lista
'        End Function




'        Public Function BuscarUsuariosImpersonate(ByVal _codigoExternoUsuario As String, _
'                                           ByVal _mnemonicoPapel As String) As IList(Of Usuario) Implements IAutorizacaoServico.BuscarUsuariosImpersonate

'            Dim _usuario As New Usuario
'            Dim _papel As New Papel
'            _usuario.CodigoExterno = _codigoExternoUsuario
'            _papel.Mnemonico = _mnemonicoPapel

'            Return Me.BuscarUsuariosImpersonate(_usuario, _papel)

'        End Function

'        Public Function BuscarUsuariosImpersonate(ByVal _usuario As Usuario, _
'                                           ByVal _mnemonicoPapel As String) As IList(Of Usuario) Implements IAutorizacaoServico.BuscarUsuariosImpersonate

'            Dim _papel As New Papel
'            _papel.Mnemonico = _mnemonicoPapel

'            Return Me.BuscarUsuariosImpersonate(_usuario, _papel)

'        End Function

'        Public Function BuscarUsuariosImpersonate(ByVal _usuario As Usuario, _
'                                   ByVal _papel As Papel) As IList(Of Usuario) Implements IAutorizacaoServico.BuscarUsuariosImpersonate

'            If String.IsNullOrEmpty(_usuario.CodigoExterno) Then
'                Throw New Exception("Não é possível buscar os impersonates de um usuário sem ser passado o código externo (login) desse usuário")
'            End If

'            If String.IsNullOrEmpty(_papel.Mnemonico) Then
'                Throw New Exception("Não é possível buscar os impersonates de um usuário sem ser passado o mnemônico do papel pai da impersonation")
'            End If

'            Return Me.UsuarioDao.BuscarUsuariosQueImpersonateUsuarioPapel(_usuario, _papel)

'        End Function

'        Public Function BuscarUsuarioDocentePorUsuario(ByVal _usuario As Usuario) As UsuarioDocente Implements IAutorizacaoServico.BuscarUsuarioDocentePorUsuario

'            If _usuario Is Nothing Then Throw New Exception("Para BuscarUsuarioDocentePorUsuario é preciso informar o Usuário")
'            If _usuario.Id = 0 Then Throw New Exception("Para BuscarUsuarioDocentePorUsuario é preciso informar o Id do Usuário")

'            Return Me.UsuarioDocenteDao.BuscarUsuarioDocentePorUsuario(_usuario)

'        End Function

'        Public Function BuscarUsuarioPorCodigoDocente(ByVal _codigoDocente As Long) As Usuario Implements IAutorizacaoServico.BuscarUsuarioPorCodigoDocente

'            If _codigoDocente = 0 Then Throw New Exception("Para BuscarUsuarioPorCodigoDocente é preciso informar o _codigoDocente")

'            Return Me.UsuarioDocenteDao.BuscarUsuarioPorCodigoDocente(_codigoDocente)

'        End Function

'        Public Function BuscarUsuariosPorPapel(ByVal _usuario As Usuario, _
'                                               ByVal _papel As Papel) As IList(Of Usuario) _
'             Implements IAutorizacaoServico.BuscarUsuariosPorPapel

'            Return Me.UsuarioDao.BuscarUsuariosPorPapel(_usuario, _papel)
'        End Function

'        Public Function BuscarUsuariosPorNome(ByVal _nome As String) As IList(Of Usuario) _
'             Implements IAutorizacaoServico.BuscarUsuariosPorNome

'            Return Me.UsuarioDao.BuscarPorNome(_nome)
'        End Function

'        Public Function BuscarUsuariosPorEmail(ByVal _email As String) As IList(Of Usuario) _
'     Implements IAutorizacaoServico.BuscarUsuariosPorEmail

'            Return Me.UsuarioDao.BuscarPorEmail(_email)
'        End Function

'        Public Function BuscarUsuariosPorNomeEmailLogin(ByVal _nome As String, ByVal _email As String, ByVal _codigoExterno As String) As IList(Of Usuario) Implements IAutorizacaoServico.BuscarUsuariosPorNomeEmailLogin

'            Return Me.UsuarioDao.BuscarPorNomeEmailLogin(_nome, _email, _codigoExterno)
'        End Function

'        Public Function BuscarUsuariosPorPapel(ByVal _papel As Dominio.Papel) As System.Collections.Generic.IList(Of Dominio.Usuario) Implements IAutorizacaoServico.BuscarUsuariosPorPapel

'            If _papel Is Nothing Then Throw New AutorizacaoException("É preciso fornecer um Papel")
'            If _papel.Id = 0 Then Throw New AutorizacaoException("O ID do Papel não foi reconhecido")

'            Return Me.UsuarioDao.BuscarUsuariosPorPapel(_papel)

'        End Function

'        Public Function BuscarPapelCodigoExterno(ByVal _codigoExterno As String) As Papel Implements IAutorizacaoServico.BuscarPapelCodigoExterno

'            If String.IsNullOrEmpty(_codigoExterno) Then Throw New AutorizacaoException("Para BuscarPapelCodigoExterno é preciso informar um código externo")

'            Return Me.PapelDao.BuscarPorCodigoExterno(_codigoExterno)

'        End Function

'        Public Function BuscarPapeisPorCodigoExterno(ByVal _codigoExterno As String) As IList(Of Papel) _
'            Implements IAutorizacaoServico.BuscarPapeisPorCodigoExterno

'            If String.IsNullOrEmpty(_codigoExterno) Then Throw New AutorizacaoException("Para BuscarPapeisPorCodigoExterno é preciso informar um código externo")

'            Return Me.PapelDao.BuscarPapeisPorCodigoExterno(_codigoExterno)

'        End Function

'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarPapeisPorPrefixoCodigoExterno(ByVal _prefixoCodigoExterno As String) _
'            As IList(Of Papel) Implements IAutorizacaoServico.BuscarPapeisPorPrefixoCodigoExterno

'            Return Me.PapelDao.BuscarPorPrefixoCodigoExterno(_prefixoCodigoExterno)

'        End Function

'        Public Function BuscarPapelCodigoUnidadeEnsino(ByVal _codigoUnidadeEnsino As String) As Papel Implements IAutorizacaoServico.BuscarPapelCodigoUnidadeEnsino

'            If String.IsNullOrEmpty(_codigoUnidadeEnsino) Then Throw New AutorizacaoException("Para BuscarPapelCodigoUnidadeEnsino é preciso informar o código da unidade de ensino")

'            Return Me.PapelDao.BuscarPorCodigoExterno(_codigoUnidadeEnsino)


'        End Function

'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarUsuariosPorPapelEUsuario( _
'            ByVal _papel As Papel, ByVal _usuario As Usuario) As IList(Of Usuario) _
'            Implements IAutorizacaoServico.BuscarUsuariosPorPapelEUsuario

'            Return Me.UsuarioDao.BuscarUsuariosPorPapelEUsuario(_papel, _usuario)

'        End Function

'        <Transaction(TransactionPropagation.Supports, ReadOnly:=True)> _
'        Public Function BuscarPapeisUsuarioPorPapel(ByVal _idPapel As Integer) _
'            As IList(Of Dominio.PapelUsuario) _
'            Implements IAutorizacaoServico.BuscarPapeisUsuarioPorPapel

'            Return Me.PapelUsuarioDao.BuscarPorPapel(_idPapel)

'        End Function

'        <Transaction(TransactionPropagation.Required)> _
'        Private Sub ExcluirPapel(ByVal _papel As Papel) Implements IAutorizacaoServico.ExcluirPapel

'            PapelDao.Apagar(_papel)

'        End Sub

'    End Class

'End Namespace
